package info.motteke.mybws.node;

import static java.util.Collections.*;
import info.motteke.mybws.Node;

import java.util.ArrayList;
import java.util.List;

/**
 * {@linkplain Node}のスケルトン実装です。
 * 
 * @author YWak
 */
public abstract class AbstractNode implements Node {

    /** 親ノード */
    protected Node parent;

    /** 子ノード */
    protected List<Node> children = new ArrayList<Node>();

    /**
     * {@inheritDoc}
     */
    @Override
    public final List<Node> children() {
        return unmodifiableList(children);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void addChild(Node child) {
        children.add(child);

        if (child instanceof AbstractNode) {
            ((AbstractNode) child).setParent(this);
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Node getParent() {
        return parent;
    }

    /**
     * 親ノードを設定します。
     * 
     * @param parent
     *            親ノード
     */
    protected void setParent(Node parent) {
        this.parent = parent;
    }

    /**
     * {@inheritDoc}
     * 
     * <code>toString(false)</code>を実行し、その結果を返します。
     */
    @Override
    public String toString() {
        return toString(false);
    }

    /**
     * ノードを文字列化します。
     * 
     * @param prettyPrint
     *            体裁を整えるかどうか
     * @return 文字列化したノード
     */
    public String toString(boolean prettyPrint) {
        ToStringVisitor visitor = new ToStringVisitor(prettyPrint);
        accept(visitor);

        return visitor.toString();
    }
}
